React Suspense ๋ฐ Error Boundaries: ๊ณ ๊ธ‰ ๋กœ๋”ฉ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ | MLOG | MLOG}> ); }; export default App;

์ด ์˜ˆ์—์„œ:

Error Boundaries ์ดํ•ด

Error Boundaries๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ JavaScript ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋‘ catchํ•˜๊ณ , ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ค‘๋‹จํ•˜๋Š” ๋Œ€์‹  ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•˜๋Š” React ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Error Boundaries์˜ ์ฃผ์š” ๊ฐœ๋…

Error Boundaries์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„

๋‹ค์Œ์€ Error Boundary๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.


import React, { Component } from 'react';

class ErrorBoundary extends Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // ๋‹ค์Œ ๋ Œ๋”๋ง์—์„œ ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    // ์˜ค๋ฅ˜ ๋ณด๊ณ  ์„œ๋น„์Šค์—๋„ ์˜ค๋ฅ˜๋ฅผ ๋กœ๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    console.error(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ง€์ • ๋Œ€์ฒด UI๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      return 

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

; } return this.props.children; } } export default ErrorBoundary;

์ด ์˜ˆ์—์„œ:

Error Boundaries ์‚ฌ์šฉ

`ErrorBoundary` ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ณดํ˜ธํ•˜๋ ค๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋กœ ๋ž˜ํ•‘ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


import React from 'react';
import ErrorBoundary from './ErrorBoundary';

const MyComponent = () => {
  // ์˜ค๋ฅ˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  throw new Error('์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค!');
};

const App = () => {
  return (
    
      
    
  );
};

export default App;

์ด ์˜ˆ์—์„œ `MyComponent`์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด `ErrorBoundary` ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ catchํ•˜๊ณ  ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Suspense ๋ฐ Error Boundaries ๊ฒฐํ•ฉ

Suspense ๋ฐ Error Boundaries๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•˜๊ณ  ํฌ๊ด„์ ์ธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ „๋žต์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Suspense๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  Error Boundaries๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ๋กœ๋”ฉ ์ƒํƒœ์™€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋‘ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Suspense ๋ฐ Error Boundaries ๊ฒฐํ•ฉ์˜ ์˜ˆ


import React, { Suspense } from 'react';
import ErrorBoundary from './ErrorBoundary';

// ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜(์˜ˆ: API์—์„œ)
const fetchData = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      // ์„ฑ๊ณต์ ์ธ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
      // resolve({ name: 'John Doe', age: 30 });

      // ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์˜ค๋ฅ˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
      reject(new Error('์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค'));

    }, 2000);
  });
};

// Suspense๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ
const createResource = (promise) => {
  let status = 'pending';
  let result;
  let suspender = promise().then(
    (r) => {
      status = 'success';
      result = r;
    },
    (e) => {
      status = 'error';
      result = e;
    }
  );

  return {
    read() {
      if (status === 'pending') {
        throw suspender;
      } else if (status === 'error') {
        throw result;
      }

      return result;
    },
  };
};

const userData = createResource(fetchData);

// ๋ฆฌ์†Œ์Šค์—์„œ ์ฝ๋Š” ์ปดํฌ๋„ŒํŠธ
const UserProfile = () => {
  const data = userData.read();
  return (
    

Name: {data.name}

Age: {data.age}

); }; const App = () => { return ( ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ค‘...}> ); }; export default App;

์ด ์˜ˆ์—์„œ:

๊ณ ๊ธ‰ ๊ธฐ์ˆ  ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€

Suspense ์„ฑ๋Šฅ ์ตœ์ ํ™”

์‚ฌ์šฉ์ž ์ง€์ • Error Boundaries

ํŠน์ • ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • Error Boundaries๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•˜๋Š” Error Boundary๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Suspense๋ฅผ ์‚ฌ์šฉํ•œ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง(SSR)

์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Suspense๋ฅผ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง(SSR)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SSR์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•œ ๋‹ค์Œ ๋‚˜๋จธ์ง€ ์ฝ˜ํ…์ธ ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Suspense๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SSR ์ค‘์— ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋™์•ˆ ๋กœ๋”ฉ ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์ฒ˜๋ฆฌ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์ „์—ญ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

Error Boundaries์—์„œ catch๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋ฅผ catchํ•˜๊ธฐ ์œ„ํ•ด ์ „์—ญ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ „์—ญ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Error Boundary๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์˜ˆ ๋ฐ ์‚ฌ์šฉ ์‚ฌ๋ก€

์ „์ž ์ƒ๊ฑฐ๋ž˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

์ „์ž ์ƒ๊ฑฐ๋ž˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Suspense๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ๋กœ๋”ฉ ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  Error Boundaries๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฏธ๊ตญ์— ์œ„์น˜ํ•œ ์˜จ๋ผ์ธ ์ƒ์ ์„ ํƒ์ƒ‰ํ•˜๋Š” ์ผ๋ณธ์˜ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ œํ’ˆ ์ด๋ฏธ์ง€์™€ ์„ค๋ช…์ด ๋กœ๋“œ๋˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Suspense๋Š” ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ „ ์„ธ๊ณ„ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ๊ฐ„๋‹จํ•œ ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ œ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์ผ์‹œ์ ์ธ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ(์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์ธํ„ฐ๋„ท ์ธํ”„๋ผ์—์„œ ํ”ํ•จ)๋กœ ์ธํ•ด ์‹คํŒจํ•˜๋ฉด Error Boundary๊ฐ€ ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ

์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ์—์„œ Suspense๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๋ฐ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ๋กœ๋”ฉ ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  Error Boundaries๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋˜๋Š” ๋น„๋””์˜ค๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋„์—์„œ ํƒ์ƒ‰ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์œ ๋Ÿฝ์˜ ์„œ๋ฒ„์— ํ˜ธ์ŠคํŒ…๋œ ๋ฏธ๋””์–ด๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Suspense๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์™„์ „ํžˆ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋œ ๊ฒฝ์šฐ(๋“œ๋ฌผ์ง€๋งŒ ๊ฐ€๋Šฅํ•จ) Error Boundary๊ฐ€ ์ „์ฒด ์†Œ์…œ ๋ฏธ๋””์–ด ํ”ผ๋“œ๊ฐ€ ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  "์‚ฌ์šฉ์ž ํ”„๋กœํ•„์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

๋Œ€์‹œ๋ณด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Suspense๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ๋กœ๋”ฉ ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  Error Boundaries๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจํŠธ ๋˜๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐ๋˜์— ์žˆ๋Š” ๊ธˆ์œต ๋ถ„์„๊ฐ€๊ฐ€ ์ „ ์„ธ๊ณ„ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜์†Œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ํˆฌ์ž ๋Œ€์‹œ๋ณด๋“œ์— ์•ก์„ธ์Šคํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Suspense๋Š” ๊ฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ๋Œ€ํ•œ ๋กœ๋”ฉ ํ‘œ์‹œ๊ธฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฑฐ๋ž˜์†Œ์˜ API๊ฐ€ ๋‹ค์šด๋œ ๊ฒฝ์šฐ Error Boundary๊ฐ€ ํ•ด๋‹น ๊ฑฐ๋ž˜์†Œ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ์ „์ฒด ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

React Suspense ๋ฐ Error Boundaries๋Š” ํƒ„๋ ฅ์ ์ด๊ณ  ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Suspense๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  Error Boundaries๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ „๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ณ  ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃจ๋ฉด์„œ Suspense ๋ฐ Error Boundaries์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ ์„ค๋ช…ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋ฉด ๊ฐ€์žฅ ์–ด๋ ค์šด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ์•ˆ์ •์ ์ธ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React๊ฐ€ ๊ณ„์† ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ Suspense ๋ฐ Error Boundaries๋Š” ์ตœ์‹  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ ์  ๋” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ์•ž์„œ ๋‚˜๊ฐ€ ํƒ์›”ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.